//给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下：选出某个字符串中的两个下标（不必不同），并交换这两个下标所对应的字符。 
//
// 如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等，返回 true ；否则，返回 false 。 
//
// 
//
// 示例 1： 
//
// 输入：s1 = "bank", s2 = "kanb"
//输出：true
//解释：例如，交换 s2 中的第一个和最后一个字符可以得到 "bank"
// 
//
// 示例 2： 
//
// 输入：s1 = "attack", s2 = "defend"
//输出：false
//解释：一次字符串交换无法使两个字符串相等
// 
//
// 示例 3： 
//
// 输入：s1 = "kelb", s2 = "kelb"
//输出：true
//解释：两个字符串已经相等，所以不需要进行字符串交换
// 
//
// 示例 4： 
//
// 输入：s1 = "abcd", s2 = "dcba"
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s1.length, s2.length <= 100 
// s1.length == s2.length 
// s1 和 s2 仅由小写英文字母组成 
// 
// Related Topics哈希表 | 字符串 | 计数 
//
// 👍 52, 👎 0 
//
//
//
//

package leetcode.editor.day;

// 1790. 仅执行一次字符串交换能否使两个字符串相等
// https://leetcode.cn/problems/check-if-one-string-swap-can-make-strings-equal/
class CheckIfOneStringSwapCanMakeStringsEqual {
    public static void main(String[] args) {
        Solution solution = new CheckIfOneStringSwapCanMakeStringsEqual().new Solution();
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        // 一次遍历
        /*public boolean areAlmostEqual(String s1, String s2) {
            Map<Character, Integer> map = new HashMap<>();
            for (char c : s1.toCharArray()) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }

            int n = s2.length(), cnt = 0;
            for (int i = 0; i < n; i++) {
                char c = s2.charAt(i);
                if (!map.containsKey(c)) return false;
                map.put(c, map.getOrDefault(c, 0) - 1);
                if (c != s1.charAt(i)) cnt++;
            }

            for (Map.Entry<Character, Integer> entry : map.entrySet()) {
                if (entry.getValue() != 0) return false;
            }

            return cnt == 2;
        }*/

        public boolean areAlmostEqual(String s1, String s2) {
            if (s1.equals(s2)) return true;
            char[] arr1 = s1.toCharArray();
            char[] arr2 = s2.toCharArray();

            int n = arr1.length, cnt = 0, idx1 = -1, idx2 = -1;
            for (int i = 0; i < n; i++) {
                if (arr1[i] != arr2[i]) {
                    cnt++;
                    if (idx1 == -1) {
                        idx1 = i;
                    } else {
                        idx2 = i;
                    }
                }
            }

            // 大于两个不相等，返回false
            if (cnt != 2) {
                return false;
            }

            // 判断交换收是否相等
            return arr1[idx1] == arr2[idx2] && arr1[idx2] == arr2[idx1];
        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}
